import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长 子串 的长度。
//
// 示例 1:
// 输入: s = "abcabcbb"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
//
// 示例 2:
// 输入: s = "bbbbb"
// 输出: 1
// 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
//
// 提示：
//         0 <= s.length <= 5 * 104
// s 由英文字母、数字、符号和空格组成
public class Solution20 {
   public int lengthOfLongestSubstring(String s) {
       Set<Character> set = new HashSet<>();
       int maxLength = 0;
       int leftPointer = 0;
       for (int i = 0; i < s.length(); i++) {
           while (set.contains(s.charAt(leftPointer))) {
               set.remove(s.charAt(leftPointer));
               leftPointer++;
           }
           set.add(s.charAt(i));
           maxLength = Math.max(maxLength, i - leftPointer + 1);
       }
       HashMap<Integer, Integer> map = new HashMap<>();
       return maxLength;
   }
}
